package Logica.Gestores;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JOptionPane;

import AccesoADatos.FechaDAO;
import AccesoADatos.PeriodoDeVedaDAO;
import AccesoADatos.UsuarioDAO;
import Excepciones.FechaNoJugadaException;
import Excepciones.PeriodoDeVedaException;
import Excepciones.PeriodoDeVedaNoExisteException;
import Logica.Entidades.Fecha;
import Logica.Entidades.Jugador;
import Logica.Entidades.Partido;
import Logica.Entidades.PeriodoDeVeda;
import Presentacion.Interfaz;
import Presentacion.Pantallas.DialogoGestionarPuntajeFecha;

public class GestorFecha {

	private int[][] jugadoresXFecha;
	private Interfaz padre;
	private FechaDAO fechaDAO;
	
	public GestorFecha(Interfaz i){
		super();
		padre = i;
		fechaDAO = new FechaDAO();
	}
	
	public Jugador obtenerJugadores(int partido){
		return null;
	}
	
	public Fecha mostrarFechas(){
		return null;
	}
	
	public boolean validarPeriodoDeVeda(int nroFecha) throws PeriodoDeVedaNoExisteException{
		
		List<List<String>> fechaDTO = PeriodoDeVedaDAO.obtenerFechaYHora(nroFecha);
		
		if(fechaDTO.size() == 0){
			throw new PeriodoDeVedaNoExisteException();
		}
		
		String [] split = fechaDTO.get(0).get(1).split(" ");
		String fechaIni = split[0] + " " + fechaDTO.get(0).get(2);
		
		split = fechaDTO.get(0).get(3).split(" ");
		String fechaFin = split[0] + " " + fechaDTO.get(0).get(4);
		
		List<String> retorno = new ArrayList<String>();
		retorno.add(fechaIni);
		retorno.add(fechaFin);
		
		
		String fechaInicio= retorno.get(0);
		String fechaFinalizacion= retorno.get(1);
		
		Date dateFechaInicio = null;
		Date dateFechaFin = null;
		Date dateFechaHoy = null;
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		
		String fechaHoy = formato.format(new Date());
		
		
		try {
            dateFechaInicio = formato.parse(fechaInicio);
            dateFechaFin= formato.parse(fechaFinalizacion);
            dateFechaHoy = formato.parse(fechaHoy);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
		
		if(dateFechaHoy.compareTo(dateFechaInicio)>0 && dateFechaHoy.compareTo(dateFechaFin)<0){
			return true;
		}
		
		return false;
	}
	
	public void cerrarFecha(int nroFecha){
		GestorEquipoFantasia gef = padre.getGestorEquipoFantasia();
		fechaDAO.guardarFechaYHoraDeInicioDeCalculos(nroFecha);
		gef.calcularPuntajeTotal(nroFecha);
		fechaDAO.setCerrada(nroFecha);
	}
	
	public void cerrarFecha2(Partido partidos){
		
	}
	
	public void confirmarCierreDeFecha(int nroFecha){
		
	}
	
	public Fecha getFechaActual(){
		return null;
		
	}
	
	public int getNroFechaActual(){
		List<List<String>> fechaDto = new ArrayList<List<String>>();
		fechaDto = fechaDAO.getFechaActual();
		return (new Integer(fechaDto.get(0).get(0))).intValue();

	}
	
	public void verDetalles(Partido partido, int nFecha) throws FechaNoJugadaException, PeriodoDeVedaException, PeriodoDeVedaNoExisteException{
		int comp = compararConFechaActual(nFecha);
		if(comp > 0){ //La fecha seleccionada ya fue jugada
			if(this.validarCerrada(nFecha)== true){
				
				DialogoGestionarPuntajeFecha dialog = new DialogoGestionarPuntajeFecha(padre,true);
				padre.setDialogoActual(dialog);
				dialog.mostrarJugadoresYPuntajes(partido,nFecha,false);
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
				dialog.setVisible(true);
			}
		}
		else if(comp < 0){ //La fecha seleccionada todavia no se jugo
			throw new FechaNoJugadaException();
		}
		else{// La fecha seleccionada es la vigente
			
			if(validarPeriodoDeVeda(nFecha)){ // Se esta en periodo de veda
				DialogoGestionarPuntajeFecha dialog = new DialogoGestionarPuntajeFecha(padre,true);
				padre.setDialogoActual(dialog);
				dialog.mostrarJugadoresYPuntajes(partido,nFecha,true);
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
				dialog.setVisible(true);
				
			}
			else // No se esta en periodo de veda
				throw new PeriodoDeVedaException();
		}
	}
	public Fecha obtenerFecha(int nroFecha){
		
		List<List<String>> fechaDTO;
		
		fechaDTO=fechaDAO.obtenerFecha(nroFecha);
		int nro = new Integer(fechaDTO.get(0).get(0)).intValue();
		int cerrada = new Integer(fechaDTO.get(0).get(3)).intValue();
		char accion = 'n';
		if(fechaDTO.get(0).get(4) != null)
			accion = fechaDTO.get(0).get(4).charAt(0);
		Fecha f = new Fecha(nro,cerrada,fechaDTO.get(0).get(1),fechaDTO.get(0).get(2),accion);
		
		return f;
		
	}
	
	public boolean validarCerrada(int fecha2){
		boolean retorno=false;

		if(this.obtenerFecha(fecha2).esfechacerrada()==1)
			retorno=true;
		else
			retorno=false;
			
	return retorno;
	}
	
	private int compararConFechaActual(int nFechaSeleccionada){
		return padre.getGestorFecha().getNroFechaActual() - nFechaSeleccionada;
	}

	
	
	
	
	
}

